package cn.cmvideo.springboot;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 函数式接口实例<br>
 * 1.函数式接口( Functional Interface ) 就是一个有且仅有一个抽象方法，但是可以有多个非抽象方法(default
 * static)的接口<br>
 * 2.函数式接口可以被隐式的转换为lambda表达式<br>
 * <br>
 * 3.JDK8之前已有的函数式接口:<br>
 * java.lang.Runnable<br>
 * java.util.concurrent.Callable<br>
 * java.security.PrivilegedAction<br>
 * java.util.Comparator<br>
 * java.io.FileFilter<br>
 * java.nio.file.PathMatcher<br>
 * java.lang.reflect.InvocationHandler<br>
 * java.beans.PropertyChangeListener<br>
 * java.awt.event.ActionListener<br>
 * javax.swing.event.ChangeListener<br>
 * <br>
 * JDK 1.8 新增加的函数接口：<br>
 * java.util.function
 * 
 * @author Administrator
 *
 */
public class FunctionalInterface
{
	public static void main(String args[])
	{
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

		// Predicate<Integer> predicate = n -> true
		// n 是一个参数传递到 Predicate 接口的 test 方法
		// n 如果存在则 test 方法返回 true

		System.out.println("输出所有数据:");

		// 传递参数 n
		// eval(list, n -> true);
		eval(list, new Predicate<Integer>()
		{

			@Override
			public boolean test(Integer t)
			{
				return true;
			}
		});

		// Predicate<Integer> predicate1 = n -> n%2 == 0
		// n 是一个参数传递到 Predicate 接口的 test 方法
		// 如果 n%2 为 0 test 方法返回 true

		System.out.println("输出所有偶数:");
		//eval(list, n -> n % 2 == 0);
		eval(list, new Predicate<Integer>()
		{

			@Override
			public boolean test(Integer t)
			{
				return t % 2 == 0;
			}
		});

		// Predicate<Integer> predicate2 = n -> n > 3
		// n 是一个参数传递到 Predicate 接口的 test 方法
		// 如果 n 大于 3 test 方法返回 true

		System.out.println("输出大于 3 的所有数字:");
		eval(list, n -> n > 3);
	}

	public static void eval(List<Integer> list, Predicate<Integer> predicate)
	{
		for (Integer n : list)
		{
			if (predicate.test(n))
			{
				System.out.println(n + " ");
			}
		}
	}
}
